package org.redmaple.core.template.dao;

import java.util.List;

import org.redmaple.core.retrieving.RedmapleCriteria;
import org.redmaple.core.retrieving.Sort;
import org.redmaple.core.template.model.BaseModel;

/**
 * 一般化DAO接口
 * 
 * @author Xiangyun
 *
 * @param <T>
 */
public interface IGenericDao<T extends BaseModel> extends IDao<T> {

	/**
	 * 将一个 <code>&lt;T&gt;</code> 对象插入到数据库中
	 * 
	 * @param entity
	 *            要存储的对象
	 * @return 插入成功的对象
	 */
	public T save(T entity);

	/**
	 * 根据主键ID更新一个 <code>&lt;T&gt;</code> 对象到数据库中
	 * 
	 * @param entity
	 *            要修改的对象
	 * @return 修改成功的对象
	 */
	public T update(T entity);

	/**
	 * 根据主键ID删除数据库中的一个 <code>&lt;T&gt;</code> 实体
	 * 
	 * @param id
	 *            要删除的对象ID
	 */
	public void delete(String id);

	/**
	 * 根据主键ID删除数据库中的多个 <code>&lt;T&gt;</code> 实体
	 * 
	 * @param ids
	 *            要删除的对象ID集合
	 */
	public void deletes(List<String> ids);

	/**
	 * 根据对象删除数据库中的一个 <code>&lt;T&gt;</code> 实体
	 * 
	 * @param entity
	 */
	public void delete(T entity);

	/**
	 * 根据主键ID查找数据库中的一个 <code>&lt;T&gt;</code> 实体
	 * 
	 * @param id
	 *            要查找的实体ID
	 * @return 查找到实体，若未找到则返回 <code>null</code> 。
	 */
	public T findOne(String id);

	/**
	 * 根据主键ID查找数据库中的一个 <code>&lt;T&gt;</code> 实体是否存在
	 * 
	 * @param id
	 *            要查找的实体ID
	 * @return true 表示该实体存在;<br/>
	 *         false 表示该实体不存在
	 */
	public boolean exists(String id);

	/**
	 * 查找出所有的实体对象，注：当该实体类继承于BakModel对象，则只会返回未被删除的实体对象
	 * 
	 * @return 查找到所有的实体对象
	 */
	public List<T> findAll();

	/**
	 * 根据检索条件与排序规则来查找实体对象的列表
	 * 
	 * @param criteria
	 *            检索条件
	 * @param orderValues
	 *            排序规则
	 * @return 查找到的实体对象集合
	 */
	public List<T> findListByCondition(RedmapleCriteria criteria,
			List<Sort> sortValues);

}